package com.example.goband.common;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 22479
 * Date: 2023-06-05
 * Time: 8:26
 */

import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;

import java.util.UUID;

/**
 * 针对密码进行加密
 * 算法 md5 + 盐
 */
public class PasswordUtils {


    /**
     * 加盐并生成最终密码
     * @param password  明文密码
     * @return  保存到数据库中 的最终密码
     */
    public static String encrypt(String password) {
        //1.通过UUID生成盐
        String salt = UUID.randomUUID().toString().replace("-","");
        //2.生成加盐之后的密码MD5 -- 加密秘密
        String saltPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes());

        //3.在加密密码前面拼接好使用的盐 生成最终密码
        String finalPassword = salt + "$" + saltPassword;
        return finalPassword;

    }


    /**
     * 2. 核实用户登录时候输入的密码
     * 用户输入的密码 + salt  -->生成加盐的密码（方法1的重载）
     *
     * @param passWord 明文
     * @param salt     固定的盐 (从数据库中提取出来)
     * @return 最终的密码
     */
    public static String encrypt(String passWord, String salt) {
        // 1.生成一个加盐之后的密码
        String saltPassword = DigestUtils.md5DigestAsHex((salt + passWord).getBytes());

        //2.生成最终的密码 --【约定格式：32位盐值+$+32位加盐之后的密码】
        String finalPassword = salt + "$" + saltPassword;
        return finalPassword;

    }

    public static boolean check(String inputPassword, String finalPassword) {
        /**
         * 检测输入的明文密码的是否为空
         * 检测数据库中读取出来的密码是否为空
         * 检测数据库中读取出来的密码是否是我们约定的格式  65length -- > 【约定格式：32位盐值+$+32位加盐之后的密码】
         */
        if (StringUtils.hasLength(inputPassword) && StringUtils.hasLength(finalPassword) &&
                finalPassword.length() == 65) {
            //1.通过数据库中保存的密码得到盐值
            String salt = finalPassword.split("\\$")[0];

            //2.重复之前加密的步骤,将明文密码和已经加得到的追踪密码进行比较
            String confirmPassWord = encrypt(inputPassword,salt);
            //3.判定是否相同
            return confirmPassWord.equals(finalPassword);

        }
        return false;
    }


}
